import turtle as t
import random
# 引入copy库用于深拷贝
import copy

snake = [[0, 0], [0, 10], [0, 20]]
direction = [0, 10]
food = [-10, 0]


# 判断小蛇是否在我们的窗口内
def inside(head):
    return -250 < head[0] < 250 and -250 < head[1] < 250


# 改变蛇的方向
def change_direction(x, y):
    direction[0] = x
    direction[1] = y


# 画小球
def draw_ball(x, y, size, color):
    t.up()
    t.goto(x, y)
    t.down()
    t.dot(size, color)


# 写Game Over
def draw_Game_Over(x, y, size, color, content):
    t.up()
    t.goto(x, y)
    t.down()
    t.pencolor(color)
    t.write(content, font=('Arial', size, 'bold'))

# snake的最后一个元素作为头部（索引为-1的元素为头部）
def snake_move():
    head = copy.deepcopy(snake[-1])
    # 经过相加 蛇的头部就向上移动了
    head = [head[0] + direction[0], head[1] + direction[1]]
    # 判断头部如果和自己身体或者和窗体碰撞了 则游戏结束
    if head in snake or not inside(head):
        draw_Game_Over(-100, 0, 30, 'red', 'Game Over')
    else:
        # 如果头部等于食物坐标，那么就是吃到了食物
        if head == food:
            # randrange() 方法返回指定递增基数集合中的一个随机数，基数默认值为1
            food[0] = random.randrange(-15, 15) * 10
            food[1] = random.randrange(-15, 15) * 10
        else:
            # 去掉尾部一个小球
            snake.pop(0)
        # 蛇的头部上方添加一个元素
        snake.append(head)
        # 清屏
        t.clear()
        # 画食物的小球
        draw_ball(food[0], food[1], 10, 'green')
        # 重新画蛇
        for body in snake:
            draw_ball(body[0], body[1], 10, 'red')
        t.ontimer(snake_move, 300)


t.ht()
t.tracer(False)
t.setup(500, 500)
snake_move()
t.listen()
t.onkeypress(lambda: change_direction(0, 10), 'Up')
t.onkeypress(lambda: change_direction(0, -10), 'Down')
t.onkeypress(lambda: change_direction(10, 0), 'Right')
t.onkeypress(lambda: change_direction(-10, 0), 'Left')
t.update()

t.done()
